{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f28455fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# data visualization\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "\n",
    "import tensorflow as tf\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from keras.models import Sequential\n",
    "from keras.layers import SimpleRNN,Dense,Dropout\n",
    "from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score\n",
    "\n",
    "import math \n",
    "import os "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "506cd016",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "sns.set(font='SimHei')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2fd9ce76",
   "metadata": {},
   "outputs": [],
   "source": [
    "df= pd.read_csv('../dataset/sh600031.csv')  # 读取股票文件\n",
    "df.set_index('date',inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "61c70e7a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2003-07-03</th>\n",
       "      <td>23.00</td>\n",
       "      <td>23.00</td>\n",
       "      <td>20.10</td>\n",
       "      <td>21.30</td>\n",
       "      <td>33816715</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-04</th>\n",
       "      <td>21.30</td>\n",
       "      <td>22.18</td>\n",
       "      <td>21.05</td>\n",
       "      <td>21.84</td>\n",
       "      <td>7697544</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-07</th>\n",
       "      <td>21.90</td>\n",
       "      <td>21.96</td>\n",
       "      <td>21.51</td>\n",
       "      <td>21.80</td>\n",
       "      <td>3951205</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-08</th>\n",
       "      <td>21.80</td>\n",
       "      <td>22.22</td>\n",
       "      <td>21.70</td>\n",
       "      <td>21.91</td>\n",
       "      <td>2117357</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-09</th>\n",
       "      <td>21.75</td>\n",
       "      <td>22.65</td>\n",
       "      <td>21.70</td>\n",
       "      <td>22.47</td>\n",
       "      <td>3440447</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             open   high    low  close    volume\n",
       "date                                            \n",
       "2003-07-03  23.00  23.00  20.10  21.30  33816715\n",
       "2003-07-04  21.30  22.18  21.05  21.84   7697544\n",
       "2003-07-07  21.90  21.96  21.51  21.80   3951205\n",
       "2003-07-08  21.80  22.22  21.70  21.91   2117357\n",
       "2003-07-09  21.75  22.65  21.70  22.47   3440447"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "160539e0",
   "metadata": {},
   "source": [
    "## 数据检查"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "54a2df6e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function to check the missing percent of a DatFrame;\n",
    "def check_missing_data(df):\n",
    "    total = df.isnull().sum().sort_values(ascending = False)\n",
    "    percent = round(df.isnull().sum().sort_values(ascending = False) * 100 /len(df),2)\n",
    "    return pd.concat([total, percent], axis=1, keys=['Total','Percent'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "862a721d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Total</th>\n",
       "      <th>Percent</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>open</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>high</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>low</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>close</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>volume</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Total  Percent\n",
       "open        0      0.0\n",
       "high        0      0.0\n",
       "low         0      0.0\n",
       "close       0      0.0\n",
       "volume      0      0.0"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "check_missing_data(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "350f50c5",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(df.corr())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a81bbda3",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "df.drop(['volume'],axis = 1,inplace= True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "7640dff5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2003-07-03</th>\n",
       "      <td>23.00</td>\n",
       "      <td>23.00</td>\n",
       "      <td>20.10</td>\n",
       "      <td>21.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-04</th>\n",
       "      <td>21.30</td>\n",
       "      <td>22.18</td>\n",
       "      <td>21.05</td>\n",
       "      <td>21.84</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-07</th>\n",
       "      <td>21.90</td>\n",
       "      <td>21.96</td>\n",
       "      <td>21.51</td>\n",
       "      <td>21.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-08</th>\n",
       "      <td>21.80</td>\n",
       "      <td>22.22</td>\n",
       "      <td>21.70</td>\n",
       "      <td>21.91</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-09</th>\n",
       "      <td>21.75</td>\n",
       "      <td>22.65</td>\n",
       "      <td>21.70</td>\n",
       "      <td>22.47</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             open   high    low  close\n",
       "date                                  \n",
       "2003-07-03  23.00  23.00  20.10  21.30\n",
       "2003-07-04  21.30  22.18  21.05  21.84\n",
       "2003-07-07  21.90  21.96  21.51  21.80\n",
       "2003-07-08  21.80  22.22  21.70  21.91\n",
       "2003-07-09  21.75  22.65  21.70  22.47"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c94543c3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.27901685 0.27674383 0.25182185 0.26343232]\n",
      " [0.2532241  0.2643365  0.26720643 0.27196583]\n",
      " [0.26232743 0.2610077  0.27465585 0.27133372]\n",
      " ...\n",
      " [0.27901685 0.27674383 0.28987852 0.28334382]\n",
      " [0.27218935 0.27507943 0.28599185 0.28603032]\n",
      " [0.27279624 0.275836   0.28971657 0.28223765]]\n"
     ]
    }
   ],
   "source": [
    "#获取DataFrame中的数据，形式为数组array形式\n",
    "values=df.values\n",
    "#确保所有数据为float类型\n",
    "values=values.astype('float32')\n",
    " \n",
    "# 特征的归一化处理\n",
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "scaled = scaler.fit_transform(values)\n",
    "print(scaled)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "bee1cd05",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义series_to_supervised()函数\n",
    "# 将时间序列转换为监督学习问题\n",
    "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n",
    "    \"\"\"\n",
    "    将时间序列框定为有监督的学习数据集。\n",
    "        论据：\n",
    "        数据：作为列表或NumPy数组的观察序列。\n",
    "        n_in：作为输入的滞后观测数（X）。\n",
    "        n_out：作为输出的观察数（y）。\n",
    "        dropnan：布尔值，决定是否删除具有NaN值的行。\n",
    "    返回：\n",
    "    pd.DataFrame(用于监督学习)\n",
    "    \"\"\"\n",
    "    n_vars = 1 if type(data) is list else data.shape[1]\n",
    "    df = pd.DataFrame(data)\n",
    "    cols, names = list(), list()\n",
    "    # input sequence (t-n, ... t-1)\n",
    "    for i in range(n_in, 0, -1):\n",
    "        cols.append(df.shift(i))\n",
    "        names += [('var%d(t-%d)' % (j + 1, i)) for j in range(n_vars)]\n",
    "    # forecast sequence (t, t+1, ... t+n)\n",
    "    for i in range(0, n_out):\n",
    "        cols.append(df.shift(-i))\n",
    "        if i == 0:\n",
    "            names += [('var%d(t)' % (j + 1)) for j in range(n_vars)]\n",
    "        else:\n",
    "            names += [('var%d(t+%d)' % (j + 1, i)) for j in range(n_vars)]\n",
    "    # put it all together\n",
    "    agg = pd.concat(cols, axis=1)\n",
    "    agg.columns = names\n",
    "    # drop rows with NaN values\n",
    "    if dropnan:\n",
    "        agg.dropna(inplace=True)\n",
    "    return agg"
   ]
  },
  {
   "cell_type": "raw",
   "id": "f331b2f2",
   "metadata": {},
   "source": [
    "该函数有四个参数：\n",
    "\n",
    "    data：输入数据需要是列表或二维的NumPy数组的观察序列。\n",
    "    n_in：输入的滞后观察数（X）。值可以在[1..len（data）]之间，可选的。默认为1。\n",
    "    n_out：输出的观察数（y）。值可以在[0..len（data）-1]之间，可选的。默认为1。\n",
    "    dropnan：Bool值，是否删除具有NaN值的行，可选的。默认为True。\n",
    "\n",
    "该函数返回一个值：\n",
    "\n",
    "    返回：用于监督学习的Pandas DataFrame。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "6ef2ef1e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#将时间序列转换为监督学习问题\n",
    "reframed = series_to_supervised(scaled, 1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "76bad08c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-1)</th>\n",
       "      <th>var2(t-1)</th>\n",
       "      <th>var3(t-1)</th>\n",
       "      <th>var4(t-1)</th>\n",
       "      <th>var1(t)</th>\n",
       "      <th>var2(t)</th>\n",
       "      <th>var3(t)</th>\n",
       "      <th>var4(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.279017</td>\n",
       "      <td>0.276744</td>\n",
       "      <td>0.251822</td>\n",
       "      <td>0.263432</td>\n",
       "      <td>0.253224</td>\n",
       "      <td>0.264336</td>\n",
       "      <td>0.267206</td>\n",
       "      <td>0.271966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.253224</td>\n",
       "      <td>0.264336</td>\n",
       "      <td>0.267206</td>\n",
       "      <td>0.271966</td>\n",
       "      <td>0.262327</td>\n",
       "      <td>0.261008</td>\n",
       "      <td>0.274656</td>\n",
       "      <td>0.271334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.262327</td>\n",
       "      <td>0.261008</td>\n",
       "      <td>0.274656</td>\n",
       "      <td>0.271334</td>\n",
       "      <td>0.260810</td>\n",
       "      <td>0.264942</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.273072</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.260810</td>\n",
       "      <td>0.264942</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.273072</td>\n",
       "      <td>0.260052</td>\n",
       "      <td>0.271448</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.281922</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.260052</td>\n",
       "      <td>0.271448</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.281922</td>\n",
       "      <td>0.268851</td>\n",
       "      <td>0.275382</td>\n",
       "      <td>0.287449</td>\n",
       "      <td>0.284766</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)   var1(t)   var2(t)   var3(t)  \\\n",
       "1   0.279017   0.276744   0.251822   0.263432  0.253224  0.264336  0.267206   \n",
       "2   0.253224   0.264336   0.267206   0.271966  0.262327  0.261008  0.274656   \n",
       "3   0.262327   0.261008   0.274656   0.271334  0.260810  0.264942  0.277733   \n",
       "4   0.260810   0.264942   0.277733   0.273072  0.260052  0.271448  0.277733   \n",
       "5   0.260052   0.271448   0.277733   0.281922  0.268851  0.275382  0.287449   \n",
       "\n",
       "    var4(t)  \n",
       "1  0.271966  \n",
       "2  0.271334  \n",
       "3  0.273072  \n",
       "4  0.281922  \n",
       "5  0.284766  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reframed.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "aaaf7b39",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-1)</th>\n",
       "      <th>var2(t-1)</th>\n",
       "      <th>var3(t-1)</th>\n",
       "      <th>var4(t-1)</th>\n",
       "      <th>var4(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.279017</td>\n",
       "      <td>0.276744</td>\n",
       "      <td>0.251822</td>\n",
       "      <td>0.263432</td>\n",
       "      <td>0.271966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.253224</td>\n",
       "      <td>0.264336</td>\n",
       "      <td>0.267206</td>\n",
       "      <td>0.271966</td>\n",
       "      <td>0.271334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.262327</td>\n",
       "      <td>0.261008</td>\n",
       "      <td>0.274656</td>\n",
       "      <td>0.271334</td>\n",
       "      <td>0.273072</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.260810</td>\n",
       "      <td>0.264942</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.273072</td>\n",
       "      <td>0.281922</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.260052</td>\n",
       "      <td>0.271448</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.281922</td>\n",
       "      <td>0.284766</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)   var4(t)\n",
       "1   0.279017   0.276744   0.251822   0.263432  0.271966\n",
       "2   0.253224   0.264336   0.267206   0.271966  0.271334\n",
       "3   0.262327   0.261008   0.274656   0.271334  0.273072\n",
       "4   0.260810   0.264942   0.277733   0.273072  0.281922\n",
       "5   0.260052   0.271448   0.277733   0.281922  0.284766"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除不想预测的特征列，这里只预测收盘价\n",
    "# 所以删除的是var1(t),var2(t),var3(t),\n",
    "reframed.drop(['var1(t)','var2(t)','var3(t)'], axis=1, inplace=True)\n",
    "# 打印数据的前5行\n",
    "reframed.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c52b915c",
   "metadata": {},
   "source": [
    "## 数据划分为训练集和测试集：\n",
    "\n",
    "* 将处理后的数据集划分为训练集和测试集。这里按0.85比例划分，将训练集和测试集的最终输入（X）转换为为LSTM的输入格式，即[samples,timesteps,features]。\n",
    "\n",
    "* Keras LSTM层的工作方式是通过接收3维（N，W，F）的数字阵列，其中N是训练序列的数目，W是序列长度，F是每个序列的特征数目。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "1fb4061b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3759, 1, 4) (3759,)\n",
      "(664, 1, 4) (664,)\n"
     ]
    }
   ],
   "source": [
    "# 划分训练集和测试集\n",
    "train = reframed.iloc[:int(len(reframed)*0.85),:].values\n",
    "test = reframed.iloc[int(len(reframed)*0.85):,:].values\n",
    "# 划分训练集和测试集的输入和输出\n",
    "train_X, train_y = train[:, :-1], train[:, -1]\n",
    "test_X, test_y = test[:, :-1], test[:, -1]\n",
    "#转化为三维数据\n",
    "# reshape input to be 3D [samples, timesteps, features]\n",
    "train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n",
    "test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))\n",
    "print(train_X.shape, train_y.shape)\n",
    "print(test_X.shape, test_y.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f65a19c",
   "metadata": {},
   "source": [
    "# 模型构建及其预测"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "012a2906",
   "metadata": {},
   "source": [
    "* 搭建LSTM模型并绘制损失图\n",
    "    * 本实验使用keras深度学习框架对模型进行快速搭建。建立Sequential模型，向其中添加LSTM层，设定Dropout为0.5，加入Dense层将其维度聚合为1，激活函数使用relu（也用了sigmoid作为激活函数，但实验效果不如relu），损失函数定为均方差Mean Absolute Error(MAE)。优化算法采用Adam，模型采用50个epochs并且每个batch的大小为100。其中：隐藏层有64个神经元，输出层1个神经元（回归问题），输入变量是一个时间步（t-1）的特征。在fit()函数中设置validation_data参数，记录训练集和测试集的损失。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3ee2975",
   "metadata": {},
   "source": [
    "### 预测一次，并保存预测结构，用于之后的验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b71edde8",
   "metadata": {},
   "outputs": [],
   "source": [
    "checkpoint_save_path = \"./checkpoint/test_2.ckpt\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e85a0f7c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,\n",
    "                                                 save_weights_only=True,\n",
    "                                                 save_best_only=True,\n",
    "                                                 monitor='val_loss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "2738cd6d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "38/38 - 3s - loss: 0.0641 - val_loss: 0.0988 - 3s/epoch - 77ms/step\n",
      "Epoch 2/50\n",
      "38/38 - 0s - loss: 0.0522 - val_loss: 0.0149 - 295ms/epoch - 8ms/step\n",
      "Epoch 3/50\n",
      "38/38 - 0s - loss: 0.0292 - val_loss: 0.0712 - 252ms/epoch - 7ms/step\n",
      "Epoch 4/50\n",
      "38/38 - 0s - loss: 0.0355 - val_loss: 0.0265 - 249ms/epoch - 7ms/step\n",
      "Epoch 5/50\n",
      "38/38 - 0s - loss: 0.0251 - val_loss: 0.0121 - 265ms/epoch - 7ms/step\n",
      "Epoch 6/50\n",
      "38/38 - 0s - loss: 0.0192 - val_loss: 0.0121 - 272ms/epoch - 7ms/step\n",
      "Epoch 7/50\n",
      "38/38 - 0s - loss: 0.0182 - val_loss: 0.0121 - 261ms/epoch - 7ms/step\n",
      "Epoch 8/50\n",
      "38/38 - 0s - loss: 0.0173 - val_loss: 0.0200 - 285ms/epoch - 8ms/step\n",
      "Epoch 9/50\n",
      "38/38 - 0s - loss: 0.0175 - val_loss: 0.0094 - 316ms/epoch - 8ms/step\n",
      "Epoch 10/50\n",
      "38/38 - 0s - loss: 0.0175 - val_loss: 0.0200 - 330ms/epoch - 9ms/step\n",
      "Epoch 11/50\n",
      "38/38 - 0s - loss: 0.0178 - val_loss: 0.0091 - 279ms/epoch - 7ms/step\n",
      "Epoch 12/50\n",
      "38/38 - 0s - loss: 0.0158 - val_loss: 0.0166 - 264ms/epoch - 7ms/step\n",
      "Epoch 13/50\n",
      "38/38 - 0s - loss: 0.0151 - val_loss: 0.0169 - 261ms/epoch - 7ms/step\n",
      "Epoch 14/50\n",
      "38/38 - 0s - loss: 0.0162 - val_loss: 0.0301 - 245ms/epoch - 6ms/step\n",
      "Epoch 15/50\n",
      "38/38 - 0s - loss: 0.0194 - val_loss: 0.0194 - 282ms/epoch - 7ms/step\n",
      "Epoch 16/50\n",
      "38/38 - 0s - loss: 0.0250 - val_loss: 0.1313 - 248ms/epoch - 7ms/step\n",
      "Epoch 17/50\n",
      "38/38 - 0s - loss: 0.0426 - val_loss: 0.0620 - 261ms/epoch - 7ms/step\n",
      "Epoch 18/50\n",
      "38/38 - 0s - loss: 0.0245 - val_loss: 0.0207 - 266ms/epoch - 7ms/step\n",
      "Epoch 19/50\n",
      "38/38 - 0s - loss: 0.0223 - val_loss: 0.0539 - 281ms/epoch - 7ms/step\n",
      "Epoch 20/50\n",
      "38/38 - 0s - loss: 0.0233 - val_loss: 0.0372 - 288ms/epoch - 8ms/step\n",
      "Epoch 21/50\n",
      "38/38 - 0s - loss: 0.0252 - val_loss: 0.0663 - 253ms/epoch - 7ms/step\n",
      "Epoch 22/50\n",
      "38/38 - 0s - loss: 0.0232 - val_loss: 0.0112 - 247ms/epoch - 7ms/step\n",
      "Epoch 23/50\n",
      "38/38 - 0s - loss: 0.0161 - val_loss: 0.0406 - 324ms/epoch - 9ms/step\n",
      "Epoch 24/50\n",
      "38/38 - 0s - loss: 0.0217 - val_loss: 0.0439 - 283ms/epoch - 7ms/step\n",
      "Epoch 25/50\n",
      "38/38 - 0s - loss: 0.0240 - val_loss: 0.0670 - 260ms/epoch - 7ms/step\n",
      "Epoch 26/50\n",
      "38/38 - 0s - loss: 0.0230 - val_loss: 0.0131 - 260ms/epoch - 7ms/step\n",
      "Epoch 27/50\n",
      "38/38 - 0s - loss: 0.0179 - val_loss: 0.0772 - 265ms/epoch - 7ms/step\n",
      "Epoch 28/50\n",
      "38/38 - 0s - loss: 0.0245 - val_loss: 0.0170 - 279ms/epoch - 7ms/step\n",
      "Epoch 29/50\n",
      "38/38 - 0s - loss: 0.0192 - val_loss: 0.0825 - 260ms/epoch - 7ms/step\n",
      "Epoch 30/50\n",
      "38/38 - 0s - loss: 0.0377 - val_loss: 0.0738 - 248ms/epoch - 7ms/step\n",
      "Epoch 31/50\n",
      "38/38 - 0s - loss: 0.0302 - val_loss: 0.0765 - 249ms/epoch - 7ms/step\n",
      "Epoch 32/50\n",
      "38/38 - 0s - loss: 0.0313 - val_loss: 0.0475 - 259ms/epoch - 7ms/step\n",
      "Epoch 33/50\n",
      "38/38 - 0s - loss: 0.0204 - val_loss: 0.0099 - 294ms/epoch - 8ms/step\n",
      "Epoch 34/50\n",
      "38/38 - 0s - loss: 0.0157 - val_loss: 0.0099 - 243ms/epoch - 6ms/step\n",
      "Epoch 35/50\n",
      "38/38 - 0s - loss: 0.0149 - val_loss: 0.0079 - 250ms/epoch - 7ms/step\n",
      "Epoch 36/50\n",
      "38/38 - 0s - loss: 0.0145 - val_loss: 0.0108 - 246ms/epoch - 6ms/step\n",
      "Epoch 37/50\n",
      "38/38 - 0s - loss: 0.0159 - val_loss: 0.0571 - 261ms/epoch - 7ms/step\n",
      "Epoch 38/50\n",
      "38/38 - 0s - loss: 0.0212 - val_loss: 0.0114 - 266ms/epoch - 7ms/step\n",
      "Epoch 39/50\n",
      "38/38 - 0s - loss: 0.0154 - val_loss: 0.0162 - 255ms/epoch - 7ms/step\n",
      "Epoch 40/50\n",
      "38/38 - 0s - loss: 0.0148 - val_loss: 0.0092 - 282ms/epoch - 7ms/step\n",
      "Epoch 41/50\n",
      "38/38 - 0s - loss: 0.0160 - val_loss: 0.0311 - 252ms/epoch - 7ms/step\n",
      "Epoch 42/50\n",
      "38/38 - 0s - loss: 0.0240 - val_loss: 0.0726 - 279ms/epoch - 7ms/step\n",
      "Epoch 43/50\n",
      "38/38 - 0s - loss: 0.0276 - val_loss: 0.0615 - 248ms/epoch - 7ms/step\n",
      "Epoch 44/50\n",
      "38/38 - 0s - loss: 0.0226 - val_loss: 0.0216 - 249ms/epoch - 7ms/step\n",
      "Epoch 45/50\n",
      "38/38 - 0s - loss: 0.0168 - val_loss: 0.0289 - 249ms/epoch - 7ms/step\n",
      "Epoch 46/50\n",
      "38/38 - 0s - loss: 0.0237 - val_loss: 0.0743 - 266ms/epoch - 7ms/step\n",
      "Epoch 47/50\n",
      "38/38 - 0s - loss: 0.0315 - val_loss: 0.1077 - 308ms/epoch - 8ms/step\n",
      "Epoch 48/50\n",
      "38/38 - 0s - loss: 0.0498 - val_loss: 0.0972 - 252ms/epoch - 7ms/step\n",
      "Epoch 49/50\n",
      "38/38 - 0s - loss: 0.0434 - val_loss: 0.0895 - 250ms/epoch - 7ms/step\n",
      "Epoch 50/50\n",
      "38/38 - 0s - loss: 0.0380 - val_loss: 0.0806 - 250ms/epoch - 7ms/step\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 搭建LSTM模型\n",
    "model = Sequential()\n",
    "model.add(SimpleRNN(100, return_sequences=True))\n",
    "model.add(Dropout(0.2))\n",
    "model.add(SimpleRNN(100))\n",
    "model.add(Dropout(0.2))\n",
    "model.add(Dense(1,activation='relu'))\n",
    "model.compile(loss='mae', optimizer='adam')\n",
    "\n",
    "if os.path.exists(checkpoint_save_path + '.index'):\n",
    "    print('-------------load the model-----------------')\n",
    "    model.load_weights(checkpoint_save_path)\n",
    "    \n",
    "# fit network\n",
    "history = model.fit(train_X, train_y, epochs=50, batch_size=100, validation_data=(test_X, test_y), verbose=2,shuffle=False,validation_freq=1,callbacks=[cp_callback])\n",
    " \n",
    "# 绘制损失图\n",
    "plt.plot(history.history['loss'], label='train')\n",
    "plt.plot(history.history['val_loss'], label='test')\n",
    "plt.title('LSTM损失图', fontsize='12')\n",
    "plt.ylabel('loss', fontsize='10')\n",
    "plt.xlabel('epoch', fontsize='10')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "134ba838",
   "metadata": {},
   "source": [
    "* 预测并反转数据（反归一化）\n",
    "    * 需要将预测结果和测试集数据组合然后进行比例反转（invert the scaling），同时需要将测试集上的预期值也进行比例转换。 \n",
    "         这里为什么进行比例反转（反归一化）呢？（因为我们将原始数据进行了预处理（连同输出值y），此时的误差损失计算是在处理之后的数据上进行的，为了计算在原始比例上的误差需要将数据进行转化。反转时的矩阵大小一定要和原来的大小（shape）完全相同，否则就会报错。）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "b024ee64",
   "metadata": {},
   "outputs": [],
   "source": [
    "#模型预测收益率\n",
    "y_predict = model.predict(test_X)\n",
    "test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))\n",
    " \n",
    "# invert scaling for forecast\n",
    "#将预测结果按比例反归一化\n",
    "inv_y_test = np.concatenate((test_X[:, :3],y_predict), axis=1)\n",
    "inv_y_test = scaler.inverse_transform(inv_y_test)\n",
    "inv_y_predict=inv_y_test[:,-1]\n",
    " \n",
    "# invert scaling for actual\n",
    "#将真实结果按比例反归一化\n",
    "test_y = test_y.reshape((len(test_y), 1))\n",
    "inv_y_train = np.concatenate((test_X[:, :3],test_y), axis=1)\n",
    "inv_y_train = scaler.inverse_transform(inv_y_train)\n",
    "inv_y = inv_y_train[:, -1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "9220b6f0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>反归一化后的预测结果</th>\n",
       "      <th>反归一化后的真实结果</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10.333802</td>\n",
       "      <td>11.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10.200555</td>\n",
       "      <td>11.08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10.100302</td>\n",
       "      <td>11.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10.080413</td>\n",
       "      <td>11.76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10.398294</td>\n",
       "      <td>11.51</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   反归一化后的预测结果  反归一化后的真实结果\n",
       "0   10.333802       11.22\n",
       "1   10.200555       11.08\n",
       "2   10.100302       11.18\n",
       "3   10.080413       11.76\n",
       "4   10.398294       11.51"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.DataFrame({\"反归一化后的预测结果\":inv_y_predict,'反归一化后的真实结果':inv_y})\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "4afb1ae4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(inv_y,color='red',label='Original')\n",
    "plt.plot(inv_y_predict,color='green',label='Predict')\n",
    "plt.xlabel('the number of test data')\n",
    "plt.ylabel('close')\n",
    "plt.title('预测与实际数据图')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "7b6485c6",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "均方误差: 35.549374\n",
      "均方根误差: 5.962330\n",
      "平均绝对误差: 5.098491\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error, mean_absolute_error\n",
    "# 评估\n",
    "# calculate MSE 均方误差 ---> E[(预测值-真实值)^2] (预测值减真实值求平方后求均值)\n",
    "mse = mean_squared_error(inv_y_predict, inv_y)\n",
    "# calculate RMSE 均方根误差--->sqrt[MSE]    (对均方误差开方)\n",
    "rmse = math.sqrt(mean_squared_error(inv_y_predict, inv_y))\n",
    "# calculate MAE 平均绝对误差----->E[|预测值-真实值|](预测值减真实值求绝对值后求均值）\n",
    "mae = mean_absolute_error(inv_y_predict, inv_y)\n",
    "print('均方误差: %.6f' % mse)\n",
    "print('均方根误差: %.6f' % rmse)\n",
    "print('平均绝对误差: %.6f' % mae)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "2416ac22",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率：0.8716861357315699\n"
     ]
    }
   ],
   "source": [
    "#ACC\n",
    "error = 0\n",
    "summery = 0\n",
    "for i in range(24):\n",
    "    error += abs(inv_y_predict[i] - inv_y[i])\n",
    "    summery += inv_y[i]\n",
    "acc = 1 - error/summery\n",
    "print(\"准确率：{}\".format(acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b466deff",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "deep",
   "language": "python",
   "name": "deep"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
